#include<stdio.h>
#include<stdlib.h>

#define MaxNum 100

// 链表结点
typedef struct arcNode{
    int adjvex;  //该边指向的位置信息
    struct arcNode* nextNode;

}ArcNode;

typedef struct
{
    char data; //顶点数据域
    ArcNode* firstarc; //第一个单链表的指针
}VNode;

//整个图
typedef struct 
{
    VNode verties[100];
    int Vexnum,Arcnum;  //图的当前定点数和弧数
}ALGraph;

/*
算法思想：
1.输入总结点数和总边数
2.建立顶点表
    依次将点的信息存入顶点表中
    使每个表头结点的指针域初始化为NULL
3.建立邻接表
    依次输入每条边依附的两个顶点
    确定两个顶点的序号i和j，建立边结点
    将此边界点插入到Vi和VJ对应的两个边链表的头部
*/

void insertNode(ALGraph* graph,ArcNode* node,int index)
{
    // 头插法插入结点
    if (graph->verties[index].firstarc==NULL)
    {
        graph->verties[index].firstarc=node;
    }
    else{
        node->nextNode=graph->verties[index].firstarc;
        graph->verties[index].firstarc=node;
    }
    
}

int Location(ALGraph *graph,char ch)
{
    for(int i=0;i<graph->Vexnum;i++)
    {
        if(graph->verties[i].data==ch)
        {
            return i;
        }
    }
    return -1;
}

void creatUDG(ALGraph* graph)
{
    char v1,v2; // 暂时存储邻接表的两个顶点
    printf("输入总结点数和总边数\n");
    scanf("%d %d",&graph->Vexnum,&graph->Arcnum);
    for(int i=0;i<graph->Vexnum;i++)
    {
        //输入结点数据
        scanf("%c",graph->verties[i].data);
        graph->verties[i].firstarc=NULL;
    }
    int k,L;
    for (int i = 0; i < graph->Arcnum; i++)
    {
        printf("输入一条边对应的两个顶点\n");
        scanf("%c %c",v1,v2);
        k=Location(graph,v1);
        L=Location(graph,v2);
        // 建立节点
        ArcNode* p1=(ArcNode*) malloc(sizeof(ArcNode));
        p1->adjvex=L;
        insertNode(graph,p1,k);
        ArcNode* p2=(ArcNode*) malloc(sizeof(ArcNode));
        p1->adjvex=k;
        insertNode(graph,p2,L);
    }
    

}

void main()
{
}